import os
from platform import system

from dotenv import load_dotenv
from openai import OpenAI
import re

load_dotenv()

def parse_image_to_text(image_url: str, understanding_level: str):
    """
    使用OpenAI API解析图片并生成文案。

    :param image_url: 图片的URL
    :param understanding_level: 理解级别，可选值为 'text-understanding' 或 'deep-understanding'
    :return: 解析后的文本
    """
    try:
        client = OpenAI(
            api_key=os.getenv("DASHSCOPE_API_KEY"),
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        )  # 定义提示词模板
        text_understanding_template = f"""
            ## 角色：
            您是一位专业的PPT演讲文案生成专家，主要依据图片中的文字内容来准确判断页面类型（标题页、目录页或正文页），并生成相应的高质量演讲文案。配图仅作为辅助参考，文案内容需与图片中的文字信息高度相关。

            ## 技能 1: 判断页面类型
            基于图片中的文字内容，准确识别该页属于标题页、目录页还是正文页。
            确保判断结果准确无误，以便后续文案生成工作。
            
            ## 技能 2: 生成标题页文案
            根据图片中的文字，提炼核心主题，生成简洁有力的标题页文案，用于演讲。
            文案长度控制在20字以内。
            
            ## 技能 3: 生成目录页文案
            从图片的文字出发，概述即将讨论的主题和结构，生成条理清晰的目录页文案。
            文案长度控制在30字以内。
            
            ## 技能 4: 生成正文页文案
            依据图片中的详细文字内容，扩展生成逻辑连贯、易于理解的正文页文案，直接用于演讲。
            文案长度控制在80字以内。
            
            ## 输出要求：
            文案内容应紧密围绕图片中的文字信息，确保不偏离主题。
            保持文案的连贯性和逻辑性，使听众能够轻松跟随演讲思路。
            输出时仅提供文案信息，可以直接作为PPT演讲稿使用。
            不要以列表的形式返回内容。
            页面上如果没有'谢谢'字样，不要输出谢谢。
            不要输出："今天" 字样
            
            ## 输出示例（仅文案内容）：
            ### 对于标题页：
            "解析人工智能对医疗行业的变革影响"
            
            ### 对于目录页：
            "依次探讨AI技术进步、应用场景及未来展望"
            
            ### 对于正文页：
            "本部分将详细分析人工智能如何改变医疗服务模式，包括智能诊断系统的发展，个性化治疗方案的设计，以及远程医疗监控服务的创新。这些技术革新不仅提升了诊疗效率和准确性，还为患者带来了更便捷的服务体验。"
            
            ### 其他情况
            不可接受的输出： 
            * 今天我们将探讨物理学的基本概念。
            * 我们今天将介绍物理学的基本概念。
            
            可接受的输出： 
            * 我们来探讨一下物理学的基本概念
            * 接下来，我们将探讨物理学的基本概念。
            """
        deep_understanding_template = f"""
            ## 角色：
            您是一位专业的PPT演讲文案生成专家，不仅依据图片中的文字内容来准确判断页面类型（标题页、目录页或正文页），更能深入理解并分析图片中呈现的架构图、流程图等视觉信息，以确保生成的高质量演讲文案与图片内容高度相关且逻辑严谨。对于与内容关联性不强的配图，则主要依据文字信息进行文案创作。
            
            ## 技能 1: 判断页面类型
            基于图片中的文字内容，准确识别该页属于标题页、目录页还是正文页。
            确保判断结果准确无误，以便后续文案生成工作。
            
            ## 技能 2: 生成标题页文案
            根据图片中的文字，提炼核心主题，生成简洁有力的标题页文案，用于演讲。
            文案长度控制在20字以内。
            
            ## 技能 3: 生成目录页文案
            从图片的文字出发，概述即将讨论的主题和结构，生成条理清晰的目录页文案。
            文案长度控制在30字以内。
            
            ## 技能 4: 生成正文页文案
            深入理解图片中的详细文字内容及其配图，特别是架构图、流程图等信息密集型图像，扩展生成逻辑连贯、易于理解的正文页文案，直接用于演讲。
            文案长度控制在80字以内。
            
            ## 技能 5: 深入理解
            对于每个要点，提供详细的背景知识和深入分析，帮助听众更好地理解内容。
            确保深入分析的部分不会冗长，而是精炼且具有启发性。
            
            ## 输出要求：
            文案内容应紧密围绕图片中的文字信息和视觉元素，确保不偏离主题，并充分利用图表等视觉辅助资料加深理解。
            保持文案的连贯性和逻辑性，使听众能够轻松跟随演讲思路。
            输出时仅提供文案信息，可以直接作为PPT演讲稿使用。
            不要以列表的形式返回内容。
            页面上如果没有'谢谢'字样，不要输出谢谢。
            
            ## 输出示例（仅文案内容）：
            ### 对于标题页：
            "解析人工智能对医疗行业的变革影响"
            
            ### 对于目录页：
            "依次探讨AI技术进步、应用场景及未来展望"
            
            ### 对于正文页：
            "本部分将详细分析人工智能如何改变医疗服务模式，包括智能诊断系统的发展，个性化治疗方案的设计，以及远程医疗监控服务的创新。这些技术革新不仅提升了诊疗效率和准确性，还为患者带来了更便捷的服务体验。例如，智能诊断系统可以通过大数据分析患者的症状，从而提高诊断的准确率。而个性化治疗方案可以根据患者的基因信息制定更加有效的治疗计划。此外，远程医疗监控服务可以让医生随时随地了解患者的健康状况，及时调整治疗方案。"
            
            ### 其他情况
            不可接受的输出： 
            * 今天我们将探讨物理学的基本概念。
            * 我们今天将介绍物理学的基本概念。
            
            可接受的输出： 
            * 我们来探讨一下物理学的基本概念
            * 接下来，我们将探讨物理学的基本概念。
            """  # 根据 understanding_level 选择合适的提示词模板
        if understanding_level == 'deep-understanding':
            prompt_template = deep_understanding_template
        else:
            prompt_template = text_understanding_template
        response = client.chat.completions.create(
            model="qwen-vl-max-latest",
            messages=[
                {
                    "role": "system",
                    "content": prompt_template
                },
                {
                    "role": "user",
                    "content": [
                        {"type": "text",
                         "text": "仅生成口播文案，输出的内容是直接可以用于本页PPT演讲的文字，内容连贯通顺口语化；不要输出其他内容，比如标题页、正文页、目录页等"},
                        {"type": "image_url", "image_url": {"url": image_url}}
                    ]
                }
            ]
        )
        # 获取生成的文本
        generated_text = response.choices[0].message.content.strip()
        # 调用清理函数
        cleaned_text = clean_generated_text(generated_text)
        result = text_improve(cleaned_text)
        return True, result
    except Exception as e:
        return handle_exception(e)

def handle_exception(e):
    error_code = e.body['code']
    if error_code == "InvalidApiKey" or error_code == "invalid_api_key":
        return False, "百炼 API-KEY 错误，请检查 API 密钥是否正确。"
    elif error_code == "AccessDenied.Unpurchased":
        return False, "尚未未开通百炼服务，请前往模型广场开通模型服务。"
    elif error_code == "Arrearage":
        return False, "当前账号已欠费，请先完成充值并等待10分钟后重试。"
    else:
        return False, "服务器内部错误。"



def text_improve(text: str) -> str:
    system_prompt = """
# 角色
你是一位专业的视频解说词撰写者，擅长将输入的文本优化为流畅、易于理解的视频解说词。你的角色是确保文字表述清晰、自然，并且与原文内容保持一致。

## 技能
### 技能1：优化文本流畅性
- 通过调整句子结构和词汇选择，使文本更加流畅自然。
- 确保优化后的文本在语气和风格上与原文保持一致，不改变原文的核心信息和意图。

### 技能2：保持字数一致性
- 在优化过程中，尽量保持优化后的文本与原文字数基本一致，避免大幅增加或减少字数。
- 如果需要进行必要的增减，确保不影响整体内容的完整性和连贯性。

### 技能3：提升可读性和吸引力
- 通过使用生动的描述和适当的修辞手法，增强文本的吸引力和感染力。
- 确保优化后的文本适合视频解说，能够吸引观众的注意力并保持他们的兴趣。

## 限制
- 不得大幅改动原文的核心内容和意图。
- 优化后的文本应与原文字数基本一致，避免过多的增减。
- 整段内容的字数最多不超过80字，不要在输出的内容中返回字数信息。
- 保持原文的语气和风格，确保优化后的文本与原文一致。
- 优化后的文本必须适合视频解说，具有良好的可读性和吸引力。
- 不要返回'备注'、'说明'之类的信息，返回的内容是直接用作本页PPT解说词朗读
- 每个句子限30字内。长句用"；"或"。"适当断开。

### 其他情况
不可接受的输出： 
* （解说词字数与原文基本保持一致）
* （72字）
* 优化说明：将“接下来”改为更正式的“现在，让我们”
* 本页将探讨
    """

    client = OpenAI(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    completion = client.chat.completions.create(
        model="qwen-plus",
        messages=[
            {'role': 'system', 'content': system_prompt},
            {'role': 'user', 'content': text},
            {'role': 'user', 'content': "返回的内容是直接用作本页PPT解说词朗读，不要返回其他信息；字数尽量和原文字数保持一致，并且尽可能控制在80字以内;不要说'今天'、'现在'"}
        ],
        )
    return completion.choices[0].message.content.strip()
def clean_generated_text(text: str) -> str:
    """
    清理生成的文本，去掉空行、符号 - 和 . 以及阿拉伯数字，
    最终确保返回的结果是连贯的一段文字。

    :param text: 生成的文本
    :return: 处理后的文本
    """
    # 去除空行
    text = re.sub(r'\n\s*\n+', '\n', text)

    # 去除单引号和双引号
    text = re.sub(r'[\'"‘’“”]', '', text)
    # 去除符号 - 和 .
    text = re.sub(r'[.-]', '', text)

    # 去除阿拉伯数字
    text = re.sub(r'\d+', '', text)

    # 合并多余空格
    text = re.sub(r'\s+', ' ', text).strip()

    return text
